package com.bjpowernode.config;

import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import com.baomidou.mybatisplus.extension.api.R;
import io.lettuce.core.dynamic.RedisCommandFactory;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import javax.annotation.Resource;
import java.time.Duration;

//自定义RedisTemplate。目的是为了解决乱码问题
//自定义缓存管理器，目的也是为了解决乱码问题
@Configuration
public class RedisConfig {

    // 注入RedisCommandFactory连接工厂进行配置
    /*的作用是将Spring容器中的RedisConnectionFactory实例自动注入到当前类中的connectionFactory成员变量中。RedisConnectionFactory是Spring Data Redis模块中用于创建Redis连接的工厂类*/
    @Resource
    RedisConnectionFactory connectionFactory;

    // 自定义redisTemplate,之前的redisTemplate是springboot默认创建管理的会产生乱码，现在自定义一个放到springboot的ioc容器中
    @Bean(name = "myredistemplate")
    RedisTemplate<String, Object> getRedisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        /*connectionFactory是用于创建Redis连接的工厂类，而redisTemplate是Spring Data Redis提供的用于操作Redis的模板类。
        通过设置连接工厂，redisTemplate可以在需要时创建与Redis服务器的连接，
        从而进行数据的读写操作。*/
        redisTemplate.setConnectionFactory(connectionFactory);
        // 设置key的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // 设置value的序列化方式
        redisTemplate.setValueSerializer(new FastJsonRedisSerializer<Object>(Object.class));
        return redisTemplate;
    }

    //自定义缓存管理器，目的也是为了解决乱码问题
    //我们自己造一个缓存管理器 存放到ioc容器中
    @Bean
    CacheManager getCacheManager() {
        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofDays(90)) //缓存有效期90天（一般来讲，90天就是最长期保存缓存的时间了）
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new FastJsonRedisSerializer<Object>(Object.class)));

        RedisCacheManager cacheManager = new RedisCacheManager(
                RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory), configuration
        );
        return cacheManager;
    }
}
